//---------------------------------// // // //---------------------------------// int Recompress( LONG ofStart, LONG ofEnd, char *InputFile, char *OutputFile ) { char tuf[512]; BYTE buf[0x400]; LONG Lof; WORD bfPosi; df = fopen( InputFile, "rb" ); if ( !df ){ ShowMessage("Fatal Error: Could not open Input file." ); return 2; } Lof = FileSize( df ); // cpu.rom = (BYTE *)malloc( 0x10000 ); if ( !cpu.rom ){ ShowMessage("Fatal Error: Could not allocate needed memory." ); return 2; } // Read data to be compressed fread( cpu.ram, 1, Lof, df ); fclose( df ); memset( cpu.rom, 0, 0x10000 ); memset( buf , 0, 0x00400 ); cpu.lpCPos = cpu.lpRPos = 0; cmp.posi = cmp.back_posi = 0; cmp.bit_pos = 0; cmp.count = 0; cmp.posi = 0; bfPosi = 0x03EE; //-------------------------------------// // Start of Main Recompression Routine // //-------------------------------------// while( cmp.posi < Lof ) { // Loop for 8 BITS reg.y = 8; cmp.bit_pos = 0; while( reg.y-- > 0 ) { // if ( cmp.posi > 0x03FF ) cmp.back_posi = ( cmp.posi - 0x03FF ); else cmp.back_posi = 0; //------------------------------// // Search for compressable data // //------------------------------// cmp.most = 0; // while( cmp.back_posi < cmp.posi ) { // if ( cpu.ram[ cmp.posi ] == cpu.ram[ cmp.back_posi ] ) { // cmp.count = 0; // Loop while new data matches old data while( ( cpu.ram[ cmp.posi + cmp.count ] == cpu.ram[ cmp.back_posi + cmp.count ] ) && ( cmp.posi + cmp.count ) < Lof && cmp.count < 18 ) // cmp.count++; // If more data found, change most if ( cmp.count > cmp.most ) { // cmp.most_posi = ( ( cmp.back_posi - 0x12 ) & 0x03FF ); cmp.most = cmp.count; }// END IF // Break if the maxium amount of data is reached if ( cmp.most >= 18 ) { // cmp.most = 18; break; } }// END IF // cmp.back_posi++; }// WEND - bck < cpos //------------------------------// // Test for Regular or Compress // // data storage // //------------------------------// if ( cmp.most >= 3 ) { // reg.a = ( cmp.most - 3 ) & 0x000F; reg.a |= ( cmp.most_posi >> 4 ) & 0x00F0; reg.a |= ( cmp.most_posi & 0x00FF ) << 8; // cmp.buffer[ cpu.lpCPos++ ] = (reg.a >> 8) & 0xFF; cmp.buffer[ cpu.lpCPos++ ] = (reg.a & 0xFF); cmp.bit_pos >>= 1; // Copy data to temp buffer cmp.posi += cmp.most; } else { // store the regular data bfPosi &= 0x3FF; cmp.buffer[ cpu.lpCPos++ ] = cpu.ram[ cmp.posi++ ]; cmp.bit_pos >>= 1; cmp.bit_pos |= 0x80; }// END IF }// WEND - 8-BIT Loop // Transfer the data cpu.rom[ cpu.lpRPos++ ] = cmp.bit_pos; memcpy( &cpu.rom[ cpu.lpRPos ], cmp.buffer, cpu.lpCPos ); cpu.lpRPos += cpu.lpCPos; // Reset data cmp.bit_pos = 0; cpu.lpCPos = 0; memset( cmp.buffer, 0, 18 ); } // WEND - Lof //-----------------------------------// // Try to recompress back to the ROM // //-----------------------------------// if ( cpu.lpRPos <= (ofEnd - (ofStart+4)) ) { // rf = fopen( OutputFile, "r+b" ); if ( !rf ){ ShowMessage("Fatal Error: Could not open Output File." ); return 2; } // fseek( rf, ofStart, SEEK_SET ); // File size fwrite( &cmp.posi, 1, 2, rf ); // Store the Data fseek( rf, ofStart + 4, SEEK_SET ); fwrite( cpu.rom, 1, cpu.lpRPos, rf ); fclose( rf ); // sprintf( tuf, "Compresed \"%s\" successfully with %d BYTES to spare!", InputFile, (ofEnd - (ofStart+4)) - cpu.lpRPos ); // printf( tuf ); } else { sprintf( tuf, "Error: Data %d BYTES too large to save from file: \"%s\"!", cpu.lpRPos - (ofEnd - (ofStart+4)), InputFile ); // printf( tuf ); return 1; } return 0; }// End Of SUB